package com.wl.designpattern.interpreter;

/**
 * 解释器模式
 * 给定一门语言，定义它的文法的一种表示，并定义一个解释器，该解释器使用该表示来解释语言中的句子。
 *
 * AbstractExpression（抽象表达式）：定义一个抽象的解释方法，其具体的实现在各个具体的子类解释器中完成。
 * TerminalExpression（终结符表达式）：实现对文法中与终结符有关的解释操作。
 * NonterminalExpression（非终结符表达式）：实现对文法中的非终结符有关的解释操作。
 * Context（环境角色）：包含解释器之外的全部信息。
 * Client（客户端角色）：解析表达式，构建抽象语法树，执行具体的解释操作等。
 *
 * 应用场景
 * 简单的语法需要解释时，如解释一个sql语句。
 * 一些重复发生的问题，比如加减乘除四则运算，但是公式每次都不同，有时是a+b-cd，有时是ab+c-d等，公式千变万化，但是都是由加减乘除四个非终结符来连接的，这时我们就可以使用解释器模式。
 *
 * 优点
 * 灵活的扩展性，想扩展语法规则时只需新增新的解释器就可以了。如上面的例子中，想增加乘除法，只想增加相应的解释类，并增加相应的表达式解释操作即可。
 *
 * 缺点
 * 每一个文法都至少对应一个解释器，会产生大量的类，难于维护。
 * 解释器模式由于大量使用循环和递归，需要考虑效率的问题，而且调试也不方便。
 * 对于复杂的文法，构建其抽象语法树会显得异常繁琐。
 * 所以不推荐在重要的模块中使用解释器模式，维护困难。
 *
 * android 应用
 * AndroidManifest.xml 由PackageManagerService使用PackageParser这个类来解释的
 *
 * Created by wangliang on 2021/2/27.
 */
public class Test {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        calculator.read("a = 1024");//读取表达式
        calculator.read("b = 512");
        System.out.println("a = 1024");
        System.out.println("b = 512");

        calculator.read("a + b");
        System.out.println("a + b = " + calculator.calculate());//计算结果
        calculator.read("a - b");
        System.out.println("a - b = " + calculator.calculate());
    }
}
